5. Vincoli di integrità

Le relazioni che hanno ogni tupla che contiene valori atomici sono in prima forma normale.

Vincoli di integrità

Sono proprietà che devono essere soddisfatte dalle istanze che rappresentano informazioni corrette.

Ogni vincolo può essere visto come una funzione booleana (o un predicato) che associa ad ogni istanza il valore vero o falso.

Tipi di vincoli:

Vincoli di tupla

Esprimono condizioni sui valori di ciascuna tupla. Una possibile sintassi: espressione booleana (con AND, OR e NOT) di atomi che confrontano valori di attributo o espressioni aritmetiche su di essi. Un vincolo di tupla è un vincolo di dominio se coinvolge un solo attributo.

Esempio: (VOTO ≥ 18) AND (VOTO ≤30)

Chiavi e valori nulli

In presenza di valori nulli, i valori degli attributi che formano la chiave:

Per questo motivo le chiavi primarie non possono assumere valori nulli.

Vincolo di integrità referenziale (foreign key)

Informazioni in relazioni diverse sono correlate attraverso valori comuni: in particolare, valori delle chiavi (primarie, di solito).

Un vincolo di integrità referenziale fra un insieme di attributi X di una relazione R1 e un’altra relazione R2 impone ai valori su X di ciascuna tupla dell’istanza di R1 di comparire come valori della chiave (primaria) dell’istanza di R2.

Dipendenze funzionali

I vincoli di chiave sono dei particolari tipi di vincoli, parte di una categoria di vincoli più vasta: le dipendenze funzionali.

Dati due insiemi di attributi X e Y, si dice che “X determina Y” ( o che Y dipende funzionalmente da X), e si scrive X —> Y, sse, date due tuple distinte t1t_1 e t2t_2, se t1[X]=t2[X]t_1[X]=t_2[X] allora t1[Y]=t2[Y]t_1[Y]=t_2[Y].

Si dice che una dipendenza funzionale Y—>Z è non banale se nessun attributo di Z compare come attributo in Y

Ridondanze e anomalie

Si ha una ridondanza quando un valore è ripetuto più volte all’interno di tuple di tabelle differenti, o in generale nella stessa base di dati.

Questo può creare delle anomalie, cioè situazioni nelle quali è necessario cambiare tutti i campi che fanno riferimento allo stesso valore.

Le anomalie possono essere di tre tipi:

Forma normale di Boyce Codd

Una relazione R è in forma normale di Boyce e Codd (BCNF) se, per ogni dipendenza X —> Y in R, X contiene la chiave K di R (X è superchiave).

Questa forma normale richiede che i concetti in una relazione siano omogenei (solo proprietà direttamente associate alla chiave).

È possibile che una relazione non in forma normale venga decomposta in due o più relazioni in forma normale: la decomposizione si può attuare effettuando proiezioni in modo tale da ottenere che ciascuna dipendenza funzionale definisca la chiave di una relazione separata.

Quando la relazione originale è ricostruibile mediante join la decomposizione è corretta e si dice essere senza perdita.

Formalmente, una relazione r si decompone senza perdita su X1e X2 se il join delle proiezioni di r su X1 e X2 è uguale a r stessa (cioè non vengono prodotte tuple spurie).

La decomposizione senza perdita è garantita se gli attributi comuni contengono una chiave per almeno una delle relazioni decomposte.

NB: la forma normale di Boyce Codd non è sempre raggiungibile.

Conservazione delle dipendenze

Quando si effettua una decomposizione, le dipendenze vanno conservate.

Una decomposizione conserva le dipendenze se ogni dipendenza funzionale dello schema originale coinvolge attributi che compaiono assieme negli schemi decomposti.

La decomposizione dovrebbe conservare le dipendenze in modo da garantire che sullo schema decomposto valgano gli stessi vincoli dello schema originale.

Le decomposizioni dovrebbero sempre soddisfare le proprietà di decomposizione senza perdita e conservazione delle dipendenze:

Terza forma normale

Una relazione r è in terza forma normale se, per ogni dipendenza funzionale (non banale) X —> Y definita su di essa, almeno una delle seguenti condizioni è verificata:

La decomposizione di una relazione che non soddisfa la terza forma normale avviene, come per la BCNF, per proiezione sugli attributi coinvolti nella dipendenza funzionale.

La sola condizione da rispettare in questo processo è che tra le relazioni risultanti ce ne sia una che contiene la chiave della relazione di partenza. Questo ci permetterà di mantenere il legame definito da quella dipendenza.

Forme normali più note

Prima forma normale: una relazione è in 1NF se e solo se ciascun attributo è definito su un dominio con valori atomici (già visto).

Seconda forma normale: una relazione è in 2NF se è in 1NF e inoltre tutti gli attributi non chiave dipendono funzionalmente dall'intera chiave. Tale normalizzazione elimina le dipendenze parziali.

Terza forma normale (definizione equivalente alla precedente): una relazione è in 3NF se è in 2NF e inoltre non contiene dipendenze transitive dalla chiave, cioè, tutti gli attributi non-chiave dipendono direttamente dalla chiave.